package com.qiao.dfw;

import com.qiao.dfw.config.Const;
import com.qiao.dfw.config.SpringBeanUtil;
import com.qiao.dfw.define.DataConfigManager;
import com.qiao.dfw.loggic.TaskFactory;
import com.qiao.dfw.netty.BootNettyServer;
import com.qiao.dfw.thread.ThreadManager;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// @EnableAsync   // 如果开启 异步执行,关闭项目需要 两次;所以这个项目不使用了;
@SpringBootApplication
public class ServerApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }

    // @Async
    @Override // 使用异步注解方式启动netty服务端服务
    public void run(String... args) throws Exception {
        InitData();
        BootNettyServer bean = new BootNettyServer();
        bean.bind(Const.Port);
    }

    private static void InitData() {
        try {
            // 配置表数据最先 初始化
            DataConfigManager.init();
            ThreadManager.init();

            // 工厂最后初始化
            TaskFactory.init();


        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
            System.out.println("启动失败!!!");
        }
    }

    public static void Exit() {
        /**
         * 关闭 netty
         */
        BootNettyServer bean = SpringBeanUtil.getBean(BootNettyServer.class);
        bean.exit();
        /**
         * 关闭自己创建的线程
         */
        ThreadManager.exit();
        /**
         * 退出虚拟机
         */
        System.exit(0);
    }
}
